热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正方体|螺旋桨_Three.js案例从0到1复杂的计算组合生成几何体

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Three.js案例从0到1复杂的计算组合生成几何体相关的知识,希望对你有一定的参考价值。1.重构初始化,

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Three.js案例从0到1复杂的计算组合生成几何体相关的知识,希望对你有一定的参考价值。


1. 重构初始化,结构性更好

主程序

function init(event)
console.log("main js start. ")
createScene();
createLights();
createSea();

animate();
window.addEventListener('load', init, false);

创建场景和灯光分开

function createScene()
HEIGHT = window.innerHeight;
WIDTH = window.innerWidth;
scene = new THREE.Scene();
aspectRatio = WIDTH / HEIGHT;
fieldOfView = 60;
nearPlane = 1;
farPlane = 10000;
camera = new THREE.PerspectiveCamera(
fieldOfView,
aspectRatio,
nearPlane,
farPlane
);
scene.fog = new THREE.Fog(0xf7d9aa, 100, 950);
camera.position.x = 0;
camera.position.z = 200;
camera.position.y = 100;
renderer = new THREE.WebGLRenderer( alpha: true, antialias: true );
renderer.setSize(WIDTH, HEIGHT);
renderer.shadowMap.enabled = true;
container = document.getElementById('world');
container.appendChild(renderer.domElement);
window.addEventListener('resize', handleWindowResize, false);
// LIGHTS
var ambientLight, hemisphereLight, shadowLight;
function createLights()
hemisphereLight = new THREE.HemisphereLight(0xaaaaaa, 0x000000, .9)
shadowLight = new THREE.DirectionalLight(0xffffff, .9);
shadowLight.position.set(150, 350, 350);
shadowLight.castShadow = true;
shadowLight.shadow.camera.left = -400;
shadowLight.shadow.camera.right = 400;
shadowLight.shadow.camera.top = 400;
shadowLight.shadow.camera.bottom = -400;
shadowLight.shadow.camera.near = 1;
shadowLight.shadow.camera.far = 1000;
shadowLight.shadow.mapSize.width = 2048;
shadowLight.shadow.mapSize.height = 2048;
scene.add(hemisphereLight);
scene.add(shadowLight);

加入了屏幕调整自适应


function handleWindowResize()
HEIGHT = window.innerHeight;
WIDTH = window.innerWidth;
renderer.setSize(WIDTH, HEIGHT);
camera.aspect = WIDTH / HEIGHT;
camera.updateProjectionMatrix();

sea和plane的创建实例

// 创建实例化sea函数
function createSea()
sea = new Sea();
sea.mesh.position.y = -600;
scene.add(sea.mesh);

动画效果


function animate()
requestAnimationFrame(animate);
//海浪效果
sea.mesh.rotation.z += .005;

renderer.render(scene, camera);
;

完成效果



2. 建立复杂模型,用模型组合成飞机,并实例化

// 创建飞机模型
AirPlane = function()
this.mesh = new THREE.Object3D();
// 创建机舱
var geomCockpit = new THREE.BoxGeometry(60, 50, 50, 1, 1, 1);
var matCockpit = new THREE.MeshPhongMaterial(
color: Colors.red,
shading: THREE.FlatShading
);
var cockpit = new THREE.Mesh(geomCockpit, matCockpit);
cockpit.castShadow = true;
cockpit.receiveShadow = true;
this.mesh.add(cockpit);
// 创建引擎
var geomEngine = new THREE.BoxGeometry(20, 50, 50, 1, 1, 1);
var matEngine = new THREE.MeshPhongMaterial(
color: Colors.white,
shading: THREE.FlatShading
);
var engine = new THREE.Mesh(geomEngine, matEngine);
engine.position.x = 40;
engine.castShadow = true;
engine.receiveShadow = true;
this.mesh.add(engine);
// 创建机尾
var geomTailPlane = new THREE.BoxGeometry(15, 20, 5, 1, 1, 1);
var matTailPlane = new THREE.MeshPhongMaterial(
color: Colors.red,
shading: THREE.FlatShading
);
var tailPlane = new THREE.Mesh(geomTailPlane, matTailPlane);
tailPlane.position.set(-35, 25, 0);
tailPlane.castShadow = true;
tailPlane.receiveShadow = true;
this.mesh.add(tailPlane);
// 创建机翼
var geomSideWing = new THREE.BoxGeometry(40, 8, 150, 1, 1, 1);
var matSideWing = new THREE.MeshPhongMaterial(
color: Colors.red,
shading: THREE.FlatShading
);
var sideWing = new THREE.Mesh(geomSideWing, matSideWing);
sideWing.castShadow = true;
sideWing.receiveShadow = true;
this.mesh.add(sideWing);
// 创建螺旋桨
var geomPropeller = new THREE.BoxGeometry(20, 10, 10, 1, 1, 1);
var matPropeller = new THREE.MeshPhongMaterial(
color: Colors.brown,
shading: THREE.FlatShading
);
this.propeller = new THREE.Mesh(geomPropeller, matPropeller);
this.propeller.castShadow = true;
this.propeller.receiveShadow = true;
// 创建螺旋桨的桨叶
var geomBlade = new THREE.BoxGeometry(1, 100, 20, 1, 1, 1);
var matBlade = new THREE.MeshPhongMaterial(
color: Colors.brownDark,
shading: THREE.FlatShading
);
// 创建机翼
var blade = new THREE.Mesh(geomBlade, matBlade);
blade.position.set(8, 0, 0);
blade.castShadow = true;
blade.receiveShadow = true;
this.propeller.add(blade);
this.propeller.position.set(50, 0, 0);
this.mesh.add(this.propeller);
;
// 实例化飞机函数
function createPlane()
airplane = new AirPlane();
airplane.mesh.scale.set(.25, .25, .25);
airplane.mesh.position.y = 100;
scene.add(airplane.mesh);

主场景添加飞机模型,动画添加螺旋桨转动效果

function init(event)
console.log("main js start. ")
createScene();
createLights();
createSea();
createPlane();
animate();

 animate添加

airplane.propeller.rotation.x += 0.3;

运行效果:

 

 3. 由立方体组合成云朵,云朵变化组成天空效果

用立方体组合创建云朵,用到了随机生成


// 创建云
Cloud = function()
// 创建一个空的容器放置不同形状的云
this.mesh = new THREE.Object3D();
this.mesh.name = "cloud";
// 创建一个正方体
// 这个形状会被复制创建云
var geom = new THREE.BoxGeometry(20, 20, 20);
// 创建材质;一个简单的白色材质就可以达到效果
var mat = new THREE.MeshPhongMaterial(
color: Colors.white,
);
// 随机多次复制几何体
var nBlocs = 3 + Math.floor(Math.random() * 3);
for (var i = 0; i // 通过复制几何体创建网格
var m = new THREE.Mesh(geom.clone(), mat);
// 随机设置每个正方体的位置和旋转角度
m.position.x = i * 15;
m.position.y = Math.random() * 10;
m.position.z = Math.random() * 10;
m.rotation.z = Math.random() * Math.PI * 2;
m.rotation.y = Math.random() * Math.PI * 2;
// 随机设置正方体的大小
var s = .1 + Math.random() * .9;
m.scale.set(s, s, s);
// 允许每个正方体生成投影和接收阴影
m.castShadow = true;
m.receiveShadow = true;
// 将正方体添加至开始时我们创建的容器中
this.mesh.add(m);


创建天空

// 创建天空
Sky = function()
this.mesh = new THREE.Object3D();
this.nClouds = 20;
this.clouds = [];
var stepAngle = Math.PI * 2 / this.nClouds;
for (var i = 0; i var c = new Cloud();
this.clouds.push(c);
var a = stepAngle * i;
var h = 750 + Math.random() * 200;
c.mesh.position.y = Math.sin(a) * h;
c.mesh.position.x = Math.cos(a) * h;
c.mesh.position.z = -400 - Math.random() * 400;
c.mesh.rotation.z = a + Math.PI / 2;
var s = 1 + Math.random() * 2;
c.mesh.scale.set(s, s, s);
this.mesh.add(c.mesh);

// 创建实例
function createSky()
sky = new Sky();
sky.mesh.position.y = -600;
scene.add(sky.mesh);

形成动画效果

//天空效果
sky.mesh.rotation.z += .01;

动画效果

 

 完整例子下载

three.js从0到1实操案例,完整目录,直接可用-Javascript文档类资源-CSDN下载

 


推荐阅读
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • SpringBoot简单日志配置
     在生产环境中,只打印error级别的错误,在测试环境中,可以调成debugapplication.properties文件##默认使用logbacklogging.level.r ... [详细]
  • 开发笔记:Flutter学习笔记仿闲鱼底部导航栏带有中间凸起图标
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Flutter学习笔记--仿闲鱼底部导航栏带有中间凸起图标相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Unity Graphic功能,实现UGUI上三角形,四边形,圆环的绘制
    前言这篇简单的纪录下利用Graphic类,实现UGUI圆环的绘制。效果图如下:github目录:https:github.comluck ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 使用Flutternewintegration_test进行示例集成测试?回答首先在dev下的p ... [详细]
  • 开发笔记:小白python机器学习之路——支持向量机
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了小白python机器学习之路——支持向量机相关的知识,希望对你有一定的参考价值。支持 ... [详细]
  • 我正在使用ChemDoodleWebComponents在网页上显示分子。基本上,我可以在我的页面中插入以下脚本,它将创建一个HTML5canvas元素来显示分子。vartrans ... [详细]
author-avatar
ekuuu
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有